import org.junit.Test;

import java.util.*;
import java.util.function.BiConsumer;

/**
 * @Classname GenericExptTest
 * @Description 泛型练习
 * @Date 2023/1/26 00:55
 * @Created by louzhuangxi
 */
public class GenericExptTest {
    /**
     * 定义个泛型类 DAO<T>，在其中定义一个 Map 成员变量，Map 的键
     * 为 String 类型，值为 T 类型。
     * 分别创建以下方法：
     * public void save(String id,T entity)： 保存 T 类型的对象到 Map 成员
     * 变量中
     * public T get(String id)：从 map 中获取 id 对应的对象
     * public void update(String id,T entity)：替换 map 中 key 为 id 的内容,
     * 改为 entity 对象
     * public List<T> list()：返回 map 中存放的所有 T 对象
     * public void delete(String id)：删除指定 id 对象
     * 定义一个 User 类：
     * 该类包含：private 成员变量（int 类型） id，age；（String 类型）name。
     * 定义一个测试类：
     * 创建 DAO 类的对象， 分别调用其 save、get、update、list、delete 方
     * 法来操作 User 对象，
     * 使用 Junit 单元测试类进行测试。
     */

    @Test
    public void test01() {
        BaseDao<User> dao = new BaseDao<>();
        dao.save("1", new User(1, 2, "张三"));
        dao.list().forEach(System.out::println);
        System.out.println(dao.get("1"));
        dao.update("1", new User(1, 2, "张三_update"));
        dao.list().forEach(System.out::println);
        dao.delete("1");
        dao.list().forEach(System.out::println);
    }
}

class BaseDao<T> {
    private Map<String, T> map = new HashMap<>();

    public void save(String id, T entity) {
        map.put(id, entity);
    }

    public T get(String id) {
        return map.get(id);
    }

    public void update(String id, T entity) {
        map.put(id, entity);
    }

    public void delete(String id) {
        map.remove(id);
    }

    public List<T> list() {
        List<T> tList = new ArrayList<>();
        Collection<T> values = map.values();
        for (T value : values) {
            tList.add(value);
        }
        return tList;
    }
}

class User {
    private int id;
    private int age;
    private String name;

    public User(int id, int age, String name) {
        this.id = id;
        this.age = age;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        final StringBuffer sb = new StringBuffer("User{");
        sb.append("id=").append(id);
        sb.append(", age=").append(age);
        sb.append(", name='").append(name).append('\'');
        sb.append('}');
        return sb.toString();
    }
}
